package validators

import (
	"github.com/go-playground/validator/v10"
	"giv-vue-blog/models/ctype"
	"regexp"
	"unicode"
)

// ValidateName  用户名校验
func ValidateName(fl validator.FieldLevel) bool {
	name := fl.Field().String()
	//名字判断，不允许为数字
	for _, r := range name {
		// 使用 unicode.Is(unicode.Han, r) 来判断字符串中的每一个字符是否为汉字，使用 unicode.IsLetter(r) 来判断字符是否为字母
		if !unicode.Is(unicode.Han, r) && !unicode.IsLetter(r) {
			return false
		}
	}
	return true
}

// ValidatePassword 密码校验器，验证密码必须是6-12位，包含字母和数字
func ValidatePassword(fl validator.FieldLevel) bool {
	password := fl.Field().String()
	//定义密码长度
	if len(password) < 6 || len(password) > 12 {
		return false
	}
	//密码组成 数字+字母+特殊字符才合适
	if m, _ := regexp.MatchString(`^[0-9a-zA-Z!@#$%^&*()_+|<>,.?/~\[\]{}\-=:;'"]+$`, password); !m {
		return false
	}
	if m, _ := regexp.MatchString(`^[0-9]+$`, password); m {
		return false
	}
	if m, _ := regexp.MatchString(`^[a-zA-Z]+$`, password); m {
		return false
	}
	return true
}

// RoleValidate 用户角色验证输入只能是 ctype.Role类型的 1 2 3 4
func RoleValidate(f1 validator.FieldLevel) bool {
	role := f1.Field().Interface().(ctype.Role)
	return role == 1 || role == 2 || role == 3 || role == 4
}

// SignStatusValidate 用户注册来源验证 只能是ctype.SignStatus类型的 1 2 3
func SignStatusValidate(f1 validator.FieldLevel) bool {
	role := f1.Field().Interface().(ctype.SignStatus)
	return role == 1 || role == 2 || role == 3
}

// TelValidate 手机号码校验器
func TelValidate(fl validator.FieldLevel) bool {
	tel := fl.Field().String()
	//定义密码长度
	if len(tel) != 11 {
		return false
	}
	if m, _ := regexp.MatchString(`^1\d{10}$`, tel); !m {
		return false
	}
	return true
}
